import geopandas as gpd
import pandas as pd
import math
import pydeck
import folium
from folium import Choropleth, Circle, Marker
from folium.plugins import HeatMap, MarkerCluster수소 충전소 최적 입지 선정
data mining 개인 프로젝트
1. 분석배경 및 필요성
수소차 증가와 충전소 부족요즘 운전하다 보면 전기차, 수소차와 같은 친환경차가 많이 보인다. 실제로 전체 자동차 누적 등록대수 2천550만3천대(23.01 기준)중 친환경차(전기·수소·하이브리드)가 총 159만대 (6.2%)를 차지하며 약진을 계속하고 있다. 전기차는 늘어가는 수에 맞춰 충전소도 늘어나고 있지만 수소차는 그러지 못하고 있습니다. 현재 우리나라에서 수소차 누적 판매량은 2만대가 넘었고 매년 약 1만대정도 팔리고 있습니다. 실제로 2021년 현대 자동차의 수소자동차인 넥쏘의 내수 판매량은 8473대로 꽤 많이 팔렸다는 것을 알 수 있습니다. 하지만 수소차 판매량에 비해 충전소는 턱없이 부족한 상황입니다. 2021년 기준 수소충전소는 148개로 충전소 한개당 약 135대를 충전해야하는 상황이다.

앞서 수소충전소가 148개 있다고 얘기했는데 국토교통부의 발표에 따르면 2040년까지 수소충전소를 1200개정도를 설치하겠다고 발표했다. 수소충전소 1개를 짓는데 약
20억에서 30억정도의 비용이 들어간다. 국토교통부의 계획인 1200개를 다 짓는다고 가정하면 약 3조6000억정도의 어마어마한 비용이 들어갑니다. 또한, 수소충전시설의 경우 부정적인 인식을 가지고 있다. 따라서 인구밀도가 높은 수도권의 경우 부지확보 곤란 및 주민 수용성 등의 문제로 충전소 입지 선정에 어려움을 겪고 있다. 수소연료공급시설은 전기차 충전소와 달리 건축법 시행령 제19호의 위험물 저장 및 처리시설에 해당하므로 사전에 부지 적정성을 확인해야 한다. 이때, 교육환경보호법률과 주택건설기준규정에 따라 학교, 공동주택, 어린이놀이터, 의료시설, 유치원, 어린이집, 경로당 등으로부터 수평거리 50m 이상 떨어진 곳에 배치되어야 하므로 수소충전소 부지 선정 시 고려해야 하는 요소가 많다. 따라서 인구밀도가 높은 수도권의 경우, 이러한 규제요인들을 고려하기가 까다롭다. 그래서 데이터를 활용해 적절한 수소충전소 설치 지역을 알아낼려고 한다.

2. 분석 로드맵 & 수소충전소 설립 지역 확인
한국가스안전공사_수소충전소_현황 데이터를 가지고 로드맵을 그려봤다.
# data load
hc_location = pd.read_csv('/Users/jungwoolee/Desktop/project/data mining/hc_acc.csv')
# markercluster
m = folium.Map(location = [36.5053, 127.7043], tiles = 'cartodbpositron', zoom_start = 8)
# 지도에 표시
mc = MarkerCluster()
for idx, row in hc_location.iterrows():
if not math.isnan(row['경도']) and not math.isnan(row['위도']):
mc.add_child(Marker([row['위도'], row['경도']]))
m.add_child(mc)
mMake this Notebook Trusted to load map: File -> Trust Notebook
2023년_04월_자동차_등록자료_통계로 현재 수소자동차의 현황을 파악학고 한국가스안전공사_수소충전소_현황을 이용해 각 지역에 충전소가 몇개 있는지 파악하고 지역마다 충전소당 충전차량이 몇대인지 계산해서 hydrogen fueled car info 데이터를 새로 만들었다. 
이 데이터를 보면 부산광역시가 충전소당_충전차량이 660대로 전국에서 수소자동차 대비 충전소가 가장 부족한 상황인 것을 파악할 수 있다. 따라서 부산광역시에 수소충전소가 추가로 설치돼야 한다.
3. 분석 과정
앞서 부산광역시에 수소충전소가 추가로 필요하다고 말했다. 그렇다면 부산광역시 어디에 설치해야 하는지 적절한 위치를 알아내 보려고 한다. 일단 부산광역시에 설치된 기존 수소충전소 위치와 구별 수소자동차 등록수를 파악했다.
from folium.features import GeoJsonTooltip
# 마커
m = folium.Map(location = [35.1796, 129.0750], tiles='cartodbpositron', zoom_start = 10)
Choropleth(geo_data = geo_data['geometry'],
data = bs['수소차_등록수'],
columns = [bs['SGG_NM'], bs['수소차_등록수']],
key_on = "feature.id",
fill_color = 'YlGnBu',
line_opacity = 0.2,
legend_name = '부산광역시 구별 수소자동차 등록수').add_to(m)
bordersStyle = {
'color': '#696969', # 라인의 색상을 '#696969'로 설정합니다.
'weight': 1 # 라인의 두께를 1로 설정합니다.
}
folium.GeoJson(
data=geo_data,
style_function=lambda x:bordersStyle,
popup=folium.GeoJsonPopup(
fields=['SGG_NM'],
aliases=['구'],
)
).add_to(m)
folium.Circle([35.113698, 128.843072], radius = 10, color = "#FF0000", tooltip = "(주)엔케이텍 서부산").add_to(m)
folium.Circle([35.145745, 128.988180], radius = 10, color = "#FF0000", tooltip = "대도하이젠(주)수소복합충전소").add_to(m)
folium.Circle([35.328968, 129.201549], radius = 10, color = "#FF0000", tooltip = "하이넷 부산 정관 수소충전소").add_to(m)
mMake this Notebook Trusted to load map: File -> Trust Notebook
m_2 = folium.Map(location = [35.1796, 129.0750], tiles='CartoDB positron', zoom_start = 10)
Choropleth(geo_data = geo_data['geometry'],
data = bs_pop['인구밀도 (명/㎢)'],
columns = [bs_pop['SGG_NM'], bs_pop['인구밀도 (명/㎢)']],
key_on = "feature.id",
fill_color = 'YlGnBu',
line_opacity = 0.2,
legend_name = '부산광역시 구별 인구밀도 (명/㎢)').add_to(m_2)
bordersStyle = {
'color': '#696969', # 라인의 색상을 '#696969'로 설정합니다.
'weight': 1 # 라인의 두께를 1로 설정합니다.
}
folium.GeoJson(
data = geo_data,
style_function=lambda x:bordersStyle,
popup=folium.GeoJsonPopup(
fields=['SGG_NM'],
aliases=['구']
)
).add_to(m_2)
folium.Circle([35.113698, 128.843072], radius = 10, color = "#FF0000", tooltip = "(주)엔케이텍 서부산").add_to(m_2)
folium.Circle([35.145745, 128.988180], radius = 10, color = "#FF0000", tooltip = "대도하이젠(주)수소복합충전소").add_to(m_2)
folium.Circle([35.328968, 129.201549], radius = 10, color = "#FF0000", tooltip = "하이넷 부산 정관 수소충전소").add_to(m_2)
m_2Make this Notebook Trusted to load map: File -> Trust Notebook
m_3 = folium.Map(location = [35.1796, 129.0750], tiles='CartoDB positron', zoom_start = 10)
Choropleth(geo_data = geo_data['geometry'],
data = bs_fire['화재발생'],
columns = [bs_fire['SGG_NM'], bs_fire['화재발생']],
key_on = "feature.id",
fill_color = 'YlGnBu',
line_opacity = 0.2,
legend_name = '부산광역시 구별 화재발생 수 (개)').add_to(m_3)
bordersStyle = {
'color': '#696969', # 라인의 색상을 '#696969'로 설정합니다.
'weight': 1 # 라인의 두께를 1로 설정합니다.
}
folium.GeoJson(
data = geo_data,
style_function=lambda x:bordersStyle,
popup=folium.GeoJsonPopup(
fields=['SGG_NM'],
aliases=['구']
)
).add_to(m_3)
folium.Circle([35.113698, 128.843072], radius = 10, color = "#FF0000", tooltip = "(주)엔케이텍 서부산").add_to(m_3)
folium.Circle([35.145745, 128.988180], radius = 10, color = "#FF0000", tooltip = "대도하이젠(주)수소복합충전소").add_to(m_3)
folium.Circle([35.328968, 129.201549], radius = 10, color = "#FF0000", tooltip = "하이넷 부산 정관 수소충전소").add_to(m_3)
m_3Make this Notebook Trusted to load map: File -> Trust Notebook
No matching items